using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/*****************************************************************************
* @name : 豌豆射手类
* @author : S
* @date : 2022/12/14 1:02
*****************************************************************************/
public class Peashooter : Enemy
{
    // 动画组件
    //protected Animator animator;
    
    // 警戒范围距离(默认6.75) 这个值留给策划和数据来做后期调整
    public float detectionSize = 6.75f;
    // 子弹
    public Transform bullet;
    // 攻击间隔
    public float attackCd = 0.65f;
    // 上次被打时间
    float lastOnHitTime;
    // 被打间歇时间
    public float changeTime = 0.1f;
    // 上次发射子弹的时间
    private float lastAttackTime;
    // 状态机
    //protected GeneralStates state;
    // Render数组，用于改变颜色
    SpriteRenderer[] renderers;


    AudioSource attackSource;

    void Start()
    {
        // 获取角色动画组件
        animator = GetComponent<Animator>();

        // 默认是一个待机的状态
        state = GeneralStates.IDLE;
        // 默认没有被僵尸抓住
        onGrab = false;
        renderers = GetComponentsInChildren<SpriteRenderer>();

        attackSource = GetComponent<AudioSource>();
    }

    // Update is called once per frame
    void Update()
    {
        // 检测攻击范围内是否有敌人(被抓取时不需要检测了）
        if (!onGrab)
        {
            Detection();
        }
        else
        {
            // 状态改为攻击状态
            state = GeneralStates.ATTACK;
            // 找到父物体的朝向
            Zombie zombie = transform.parent.parent.GetComponent<Zombie>();
            Attack(zombie.playerCurrentDir);
            bullet.gameObject.layer = LayerMask.NameToLayer("Player");
        }
        // 状态判断
        ValidateState();

        if (Time.time > lastOnHitTime + changeTime)
        {
            CommonUtils.Instance.SetColor(renderers, Color.white);
        }
    }

    // 根据状态切换动画
    private void ValidateState()
    {
       
        switch (state) {
            case GeneralStates.IDLE:
                // 动画切换
                animator.SetBool("Shooting", false);
                break;
            case GeneralStates.ATTACK:
                
                break;
            case GeneralStates.DEAD:
                Debug.Log("死亡状态，销毁");
                Destroy(gameObject);
                break;
            default:
                break;
        }
    }




    /*****************************************************************************
    * @name : 攻击范围检测敌人（前后各射一条线,如果碰到东西,那么状态机切换-攻击状态,且自身朝向触碰线方向)
    * @author : S
    * @date : 2022/12/14 1:16
    *****************************************************************************/
    void Detection() {

        if (state == GeneralStates.DEAD) { return; }

          bulletDir = Vector2.left;
        // 朝向，默认向左
        Quaternion dir = Quaternion.LookRotation(Vector3.back);
        // 是否有敌人进入左右警戒线
        bool enemyComing = false;
        // 用于Debug的射线颜色
        Color color = Color.white;
          
        // 此处之所以要偏移-0.3 是为了让线不检测到自己（植物) 
        RaycastHit2D leftHit = Physics2D.Raycast(transform.position + new Vector3(-0.3f, 0, 0), Vector2.left, detectionSize);
        // 此处之所以要偏移0.3 是为了让线不检测到自己（植物)
        RaycastHit2D rightHit = Physics2D.Raycast(transform.position + new Vector3(0.3f, 0, 0), Vector2.right, detectionSize);
        // && leftHit.transform.gameObject.tag!= "Enemy"
        if (leftHit && leftHit.transform.gameObject.layer == 7) {
            
            color = Color.red;
           // Debug.Log($"{leftHit.collider.gameObject.name}进入左侧警戒范围"); 
            enemyComing = true;
        }
        if (rightHit && rightHit.transform.gameObject.layer == 7) {
            color = Color.red;
            //Debug.Log($"{rightHit.collider.gameObject.name}进入左侧警戒范围");
            enemyComing = true;
            dir = Quaternion.LookRotation(Vector3.forward);
            // 子弹向右发射
            bulletDir = Vector2.right;
        }


        // 打印2条线以便观看调试
        // 左
        Debug.DrawLine(transform.position + new Vector3(-0.3f, 0, 0), transform.position - new Vector3(detectionSize+0.3f, 0, 0), color);
        // 右
        Debug.DrawLine(transform.position + new Vector3(0.3f, 0, 0), transform.position + new Vector3(detectionSize+0.3f, 0, 0), color);

        if (enemyComing)
        {
            // 把脸对着敌人
            TurnTo(dir);
            // 状态改为攻击状态
            state = GeneralStates.ATTACK;
            Attack(bulletDir);
        }
        else {
            // 警戒区域找不到敌人
            // 状态改为待机状态
            state = GeneralStates.IDLE;
        }

    }
    // 转向
    void TurnTo(Quaternion dir) { 
        transform.rotation = Quaternion.Lerp(transform.rotation, dir,100);  
    }



    // 攻击
    void Attack(Vector2 bulletDir) {
        // 切换攻击动画
        animator.SetBool("Shooting", true);
        // 攻击还没冷却 就什么都不做啦
        if (Time.time < lastAttackTime + attackCd)
        {
            return;
        }
        // 子弹创建的位置是豌豆射手的嘴巴，所以我们GetChild（0），以嘴巴的位置发射 
        Vector3 pos = transform.GetChild(0).position;
        // 将子弹物体创建出来
        Transform bulletInstance = Instantiate(bullet, pos,Quaternion.identity);
        Bullet b = bulletInstance.GetComponent<Bullet>();
        b.SetDir(bulletDir);
        // 记录这一次攻击的时间
        lastAttackTime = Time.time;

        attackSource.Play();
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        CommonUtils.Instance.SetColor(renderers, Color.red);
        // 更新受击打时间
        lastOnHitTime = Time.time;
        float diff = 10f;
        if (!SubHp(diff)) {
            Debug.Log($"死了，状态:{state}");
        }
    }

    public new bool SubHp(float diff)
    {
        if (hp - diff <= 0)
        {
            hp -= diff;

            // 更改状态
            state = GeneralStates.DEAD;
            return false;
        }
        hp -= diff;
        return true;
    }
}
